Breast Cancer data set with TensorflowJS

<html>
<head></head>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
    <script lang="js">
        
        async function run(){
            const trainingUrl = '/data/wdbc-train.csv';
            
            // Take a look at the 'wdbc-train.csv' file and specify the column
            // that should be treated as the label in the space below.
            // HINT: Remember that you are trying to build a classifier that 
            // can predict from the data whether the diagnosis is malignant or benign.
            const trainingData = tf.data.csv(trainingUrl, {
                
                columnConfigs: {
                    diagnosis: {
                        isLabel: true
                    }
                }
                
            });

            // console.log(trainingData);


            // trainingData.columnNames().then(data => console.log(data));

            // window.data = trainingData

            // return
            
            // Convert the training data into arrays in the space below.
            // Note: In this case, the labels are integers, not strings.
            // Therefore, there is no need to convert string labels into
            // a one-hot encoded array of label values like we did in the
            // Iris dataset example. 
            const convertedTrainingData = trainingData.map(({xs,ys}) => {
                const labels = [
                    ys.diagnosis
                ]
                return{ xs: Object.values(xs), ys: Object.values(labels)};
            }).batch(10);
                  
            const testingUrl = '/data/wdbc-test.csv';
            
            // Take a look at the 'wdbc-test.csv' file and specify the column
            // that should be treated as the label in the space below..
            // HINT: Remember that you are trying to build a classifier that 
            // can predict from the data whether the diagnosis is malignant or benign.
            const testingData = tf.data.csv(testingUrl, {
                
                columnConfigs: {
                    diagnosis: {
                        isLabel: true
                    }
                }
                
            });
            
            // Convert the testing data into arrays in the space below.
            // Note: In this case, the labels are integers, not strings.
            // Therefore, there is no need to convert string labels into
            // a one-hot encoded array of label values like we did in the
            // Iris dataset example. 
            const convertedTestingData = testingData.map(({xs,ys}) => {
                const labels = [
                    ys.diagnosis
                ]
                return{ xs: Object.values(xs), ys: Object.values(labels)};
            }).batch(10);


            // Specify the number of features in the space below.
            // HINT: You can get the number of features from the number of columns
            // and the number of labels in the training data.
            const numOfFeatures = (await trainingData.columnNames()).length-1;


            // In the space below create a neural network that predicts 1 if the diagnosis is malignant
            // and 0 if the diagnosis is benign. Your neural network should only use dense
            // layers and the output layer should only have a single output unit with a
            // sigmoid activation function. You are free to use as many hidden layers and
            // neurons as you like.
            // HINT: Make sure your input layer has the correct input shape. We also suggest
            // using ReLu activation functions where applicable. For this dataset only a few
            // hidden layers should be enough to get a high accuracy.
            const model = tf.sequential();

            // YOUR CODE HERE
            model.add(tf.layers.dense({
                inputShape: [numOfFeatures],
                activation: "relu",
                units: 32,
            }));
            model.add(tf.layers.dense({
                activation: "relu",
                units: 64,
            }));
            model.add(tf.layers.dense({
                activation: "relu",
                units: 128,
            }));
            model.add(tf.layers.dense({
                activation: "sigmoid",
                units: 1
            }))



            // Compile the model using the binaryCrossentropy loss,
            // the rmsprop optimizer, and accuracy for your metrics.
            model.compile({
                loss: "binaryCrossentropy",
                optimizer: tf.train.rmsprop(0.06),
                metrics: ['accuracy']
            });


            await model.fitDataset(convertedTrainingData,
                             {epochs:100,
                              validationData: convertedTestingData,
                              callbacks:{
                                  onEpochEnd: async(epoch, logs) =>{
                                      console.log("Epoch: " + epoch + " Loss: " + logs.loss + " Accuracy: " + logs.acc);
                                  }
                              }});
            await model.save('downloads://my_model');
        }
        run();
    </script>
<body>
</body>
</html>